package com.cn;

import java.awt.*;
import java.util.Random;

/**
 * @Date : 2022/6/3
 * @Aouthor :wjm
 * @content : 设计小球类
 * */
public class Ball {
    //小球的直径
    public int d;
    //小球的位置
    public int x;
    public int y;
    //小球x，y轴的速度，值表示速度，正负表示方向
    public int offx;
    public int offy;
    //小球颜色
    public Color color;
    //构造方法完成属性初始化
    public Ball(){
        /*
        * 随机赋值的两种方法
        * 第一种：Math.random()
        * 注意：它的类型是bouble，并且生成随机数的范围是（0，0.99999999...）
        * 公式：(Math.random()*(最大范围-最小范围)+最小范围)
        * */
        d=(int)(Math.random()*(50-20)+20);

        /*
        * 随机赋值的两种方法
        * 第二种：创建Random对象
        * 对象中有random.nextInt（）
        *       random.nextDouble（）方法等
        * */
        //x的范围是：画布的宽度-圆的宽度     圆的坐标位置是与圆相对应的正方形坐上角顶点的坐标并不是圆心坐标
        Random random=new Random();
        x=random.nextInt(800-d);
        y=random.nextInt(400-d);
        //设置圆的速度大小
        offx=(int)(Math.random()*5+1);
        offy=(int)(Math.random()*5+1);
        //设置圆的运动方向（三元运算）
        offx=Math.random()>0.5?offx:-offx;
        offy=Math.random()>0.5?offy:-offy;
        //设置颜色  三原色红绿蓝，分别为rgb范围是0到255
        color=new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));

    }
    //创建小球的移动方法
    public void move(int width , int height){
        x+=offx;
        //对小球的x轴坐标进行判断
        if (x>width-d){//如果x超出最大边界，说明offx是正数
            //防止小球在用随机数Math.random生成时出现舍入误差，出现小球溜边情况
            x=width-d;
            offx = -offx;
        }else if(x<0){//反之说明offx是负数
            x=0;
            offx*=-1;
        }

        y+=offy;
        if(y>height-d-45){//如果y超出最大边界，说明offy是正数
            y=height-d-45;
            offy = -offy;
        }else if (y<0){//反之说明offy是负数
            y=0;
            offy*=-1;
        }

    }
    public void paintBall(Graphics g){
        //设置画笔设置要画的颜色
        g.setColor(color);
        //画一个空心小球
        //g.drawOval(ball.x,ball.y,ball.d,ball.d);
        //画一个实心小球
        g.fillOval(x,y,d,d);

    }

    //判断小球是否碰撞
    public boolean isHat(Ball other) {
        //当前小球的信息
        int x1 = this.x, y1 = this.y, d1 = this.d;
        double r1 = d1 / 2;
        //其他小球的信息
        int x2 = other.x, y2 = other.y, d2 = other.d;
        double r2 = d2 / 2;

        double a = (x1 + r1) - (x2 + r2);
        double b = (y1 + r1) - (y2 + r2);
        //圆心距,Math.sqrt返回的是double类型
        double c = Math.sqrt(a * a + b * b);
        //判断小球是否内含，当圆心距=r1-r2时内切
        if (c < r1- r2) {
            //计算出大球把小球吃掉后新球的面积
            double area=(Math.PI*r1*r1)+(Math.PI*r2*r2);
            //通过新球面积算出新球的直径
            double r3=Math.sqrt(area/Math.PI);
            double d3=r3*2;
            //将新球的直径赋值给大球
            this.d=(int) d3;
            return true;
        } else {
            return false;
        }
    }
}
